package br.com.sgi.service.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.sgi.autentication.UsuarioLogado;
import br.com.sgi.dao.UsersDao;
import br.com.sgi.model.Users;
import br.com.sgi.model.UsersIgreja;
import br.com.sgi.service.UsersIgrejaService;
import br.com.sgi.service.UsersService;
import br.com.sgi.util.Constante;

@Service("usersService")
public class UsersServiceImpl implements UsersService {

	@Autowired
	UsersDao usersDao;
	
	
	@Autowired
	private UsersIgrejaService usersIgrejaService;
	
	private static Set<Long> listaCoIgrejas;
	
	@Override
	public List<Users> buscarUsersPorCoSistema() {
		List<Users> list = usersDao.findByNamedParams("buscarUsersPorCoSistema");
		for(Users u: list){
			Hibernate.initialize(u.getAuthorities());
		}
		return list;
	}

	@Override
	public void salvar(Users users) {
		usersDao.update(users);
		
	}

	@Override
	public List<Users> buscarUsersPorUsername(String username) {
		 Map<String, Object>  params = new java.util.HashMap<String, Object>();
		 params.put("username", username);
		
		return  usersDao.findByNamedParams("buscarUserPorUsername", params);
	}
	
	
	/**
	 * Conforme o usuario, obtem os codigos das igrejas que possue permissao
	 * @return
	 */
	public Set<Long> getCoIgrejasPermissao() {
		UsuarioLogado.init();
		listaCoIgrejas = new HashSet<Long>(); 
		if(UsuarioLogado.has(Constante.ROLE_USUARIO_LOCAL) || UsuarioLogado.has(Constante.ROLE_ADMIN_LOCAL))
			listaCoIgrejas.add(UsuarioLogado.getCoIgrejaLocal());
		if(UsuarioLogado.has(Constante.ROLE_ADMIN_REGIONAL)){
			listaCoIgrejas.add(UsuarioLogado.getCoIgrejaLocal());
			addCoIgrejasAutorizadas(listaCoIgrejas);
		}
		
		return listaCoIgrejas;
	}

	private void addCoIgrejasAutorizadas(Set<Long> listaCoIgrejas){
		List<UsersIgreja> listaIgrejasAutorizadas = usersIgrejaService.buscarUsersIgrejaPorCoUsers(UsuarioLogado.getCoUsuario());
		for(UsersIgreja usersIgreja: listaIgrejasAutorizadas){
			listaCoIgrejas.add(usersIgreja.getIgreja().getCoSeqIgreja());
		}
		
	}
	
	/**
	 * cria a lista com os codigos das igrejas
	 * @param listaCodigos
	 * @return
	 */
	private StringBuffer codigoIgrejas(Set<String> listaCodigos){
		StringBuffer codigos = new StringBuffer();
		for(String codigo: listaCodigos){
			if(codigos.length() == 0)
				codigos.append(Long.valueOf(codigo));
			else{
				codigos.append(",");
				codigos.append(Long.valueOf(codigo));
			}
		}
		
		return codigos; 
	}

	@Override
	public void excluir(String username) {
		 Map<String, Object>  params = new HashMap<String, Object>();
		 params.put("username", username);
		 Users usu =  usersDao.findByNamedId("buscarUserPorUsername", params);
		
		 usersDao.deleteById(usu.getUsername());
		
	}

	@Override
	public void atualizar(Users users) {
		usersDao.update(users);
		
	}
	
	

}
